import Notice from '@/models/system/notice.model';
import { Op } from 'sequelize';
import { getLogger } from '@/utils/logger';

const logger = getLogger("notice-service", {
	console: false,
});
const consoleLogger = getLogger("notice-service");

class NoticeService {
	/** 公告分页查询 */
	async list({
		page = 1,
		pageSize = 10,
		noticeTitle,
		noticeType,
		status,
	}: any) {
		try {
			// 使用consoleLogger记录操作开始
			consoleLogger.info(`查询公告列表: page=${page}, pageSize=${pageSize}, noticeTitle=${noticeTitle || '无'}, noticeType=${noticeType || '无'}, status=${status || '无'}`);
			
			const where: any = {};
			if (noticeTitle) where.noticeTitle = { [Op.like]: `%${noticeTitle}%` };
			if (noticeType) where.noticeType = noticeType;
			if (status) where.status = status;
			
			const { count, rows } = await Notice.findAndCountAll({
				where,
				order: [["createTime", "DESC"]],
				offset: (page - 1) * pageSize,
				limit: pageSize,
			});
			
			const dataRows = rows.map(row => {
				const obj = row.toJSON();
				if (obj.noticeContent && Buffer.isBuffer(obj.noticeContent)) {
					obj.noticeContent = obj.noticeContent.toString("utf8");
				}
				return obj;
			});
			
			// 记录查询结果
			logger.info(`公告列表查询完成: 总数=${count}, 页码=${page}, 每页=${pageSize}`);
			
			return { total: count, rows: dataRows };
		} catch (error) {
			consoleLogger.error(`查询公告列表失败: ${error instanceof Error ? error.message : String(error)}`);
			throw new Error('查询公告列表失败');
		}
	}

	/** 公告详情 */
	async detail(noticeId: number) {
		try {
			// 使用consoleLogger记录操作开始
			consoleLogger.info(`查询公告详情: noticeId=${noticeId}`);
			
			// 检查noticeId是否有效
			if (isNaN(noticeId)) {
				consoleLogger.error(`查询公告详情失败: noticeId "${noticeId}" 不是有效的数字`);
				throw new Error('无效的公告ID');
			}
			
			const row = await Notice.findByPk(noticeId);
			if (!row) {
				logger.info(`未找到公告: noticeId=${noticeId}`);
				return null;
			}
			
			const obj = row.toJSON();
			if (obj.noticeContent && Buffer.isBuffer(obj.noticeContent)) {
				obj.noticeContent = obj.noticeContent.toString("utf8");
			}
			
			// 记录查询结果
			logger.info(`公告详情查询成功: noticeId=${noticeId}, noticeTitle=${obj.noticeTitle}`);
			
			return obj;
		} catch (error) {
			consoleLogger.error(`查询公告详情失败: ${error instanceof Error ? error.message : String(error)}`);
			throw new Error('查询公告详情失败');
		}
	}

	/** 新增公告 */
	async add(data: any) {
		try {
			// 使用consoleLogger记录操作开始
			consoleLogger.info(`新增公告: noticeTitle=${data.noticeTitle}, noticeType=${data.noticeType}`);
			
			// 检查必要参数
			if (!data.noticeTitle) {
				consoleLogger.error('新增公告失败: 公告标题不能为空');
				throw new Error('公告标题不能为空');
			}
			
			const result = await Notice.create(data);
			
			// 记录操作结果
			logger.info(`公告新增成功: noticeId=${result.noticeId}, noticeTitle=${result.noticeTitle}`);
			
			return result;
		} catch (error) {
			consoleLogger.error(`新增公告失败: ${error instanceof Error ? error.message : String(error)}`);
			throw new Error('新增公告失败');
		}
	}

	/** 修改公告 */
	async update(noticeId: number, data: any) {
		try {
			// 使用consoleLogger记录操作开始
			consoleLogger.info(`修改公告: noticeId=${noticeId}, noticeTitle=${data.noticeTitle}`);
			
			// 检查noticeId是否有效
			if (isNaN(noticeId)) {
				consoleLogger.error(`修改公告失败: noticeId "${noticeId}" 不是有效的数字`);
				throw new Error('无效的公告ID');
			}
			
			// 检查必要参数
			if (!data.noticeTitle) {
				consoleLogger.error('修改公告失败: 公告标题不能为空');
				throw new Error('公告标题不能为空');
			}
			
			// 检查公告是否存在
			const notice = await Notice.findByPk(noticeId);
			if (!notice) {
				logger.warn(`修改的公告不存在: noticeId=${noticeId}`);
				return [0]; // 返回0表示没有记录被更新
			}
			
			const result = await Notice.update(data, { where: { noticeId } });
			
			// 记录操作结果
			logger.info(`公告修改完成: noticeId=${noticeId}, 影响行数=${result[0]}`);
			
			return result;
		} catch (error) {
			consoleLogger.error(`修改公告失败: ${error instanceof Error ? error.message : String(error)}`);
			throw new Error('修改公告失败');
		}
	}

	/** 删除公告 */
	async remove(noticeIds: number[]) {
		try {
			// 使用consoleLogger记录操作开始
			consoleLogger.info(`删除公告: noticeIds=${JSON.stringify(noticeIds)}`);
			
			// 检查参数
			if (!noticeIds || noticeIds.length === 0) {
				consoleLogger.error('删除公告失败: 公告ID不能为空');
				throw new Error('公告ID不能为空');
			}
			
			// 检查公告是否存在
			const notices = await Notice.findAll({ where: { noticeId: noticeIds } });
			if (notices.length === 0) {
				logger.warn(`未找到要删除的公告: noticeIds=${JSON.stringify(noticeIds)}`);
				throw new Error('未找到要删除的公告');
			}
			
			const result = await Notice.destroy({ where: { noticeId: noticeIds } });
			
			// 记录操作结果
			logger.info(`公告删除完成: 删除项数量=${noticeIds.length}, 影响行数=${result}`);
			
			return result;
		} catch (error) {
			consoleLogger.error(`删除公告失败: ${error instanceof Error ? error.message : String(error)}`);
			throw new Error(error instanceof Error ? error.message : '删除公告失败');
		}
	}

	/**
	 * 批量删除公告
	 * @param noticeIds 公告ID数组
	 */
	async deleteNoticeByIds(noticeIds: number[]) {
		try {
			// 使用consoleLogger记录操作开始
			consoleLogger.info(`批量删除公告: noticeIds=${JSON.stringify(noticeIds)}`);
			
			// 检查参数
			if (!noticeIds || noticeIds.length === 0) {
				consoleLogger.error('批量删除公告失败: 公告ID不能为空');
				throw new Error('公告ID不能为空');
			}
			
			// 检查公告是否存在
			const notices = await Notice.findAll({ where: { noticeId: noticeIds } });
			if (notices.length === 0) {
				logger.warn(`未找到要删除的公告: noticeIds=${JSON.stringify(noticeIds)}`);
				throw new Error('未找到要删除的公告');
			}
			
			const result = await Notice.destroy({ where: { noticeId: noticeIds } });
			
			// 记录操作结果
			logger.info(`公告批量删除完成: 删除项数量=${noticeIds.length}, 影响行数=${result}`);
			
			return result;
		} catch (error) {
			consoleLogger.error(`批量删除公告失败: ${error instanceof Error ? error.message : String(error)}`);
			throw new Error(error instanceof Error ? error.message : '批量删除公告失败');
		}
	}
}

export default new NoticeService(); 